#pragma once
#include <iostream>
#include "log.hpp"
#include "Socket.hpp"
#include <functional>
#include <signal.h>

LOG log(PRINT_TO_SCREEN);

typedef std::function<std::string(std::string&)> func_t;

class TcpServer 
{
public:
    TcpServer(uint16_t port,func_t callback)
        : port_(port), callback_(callback) 
    {
        
    }

    bool Init()
    {
        listensocket_.Socket(); // 创建套接字
        listensocket_.Bind(port_); // 绑定端口
        listensocket_.Listen(); // 开始监听
    }

    void Run()
    {
        // daemon(0,0); // 将当前进程守护化，变成孤儿进程，由操作系统领养
        
        signal(SIGCHLD, SIG_IGN);//忽略子进程退出信号
        signal(SIGPIPE, SIG_IGN);//忽略读端异常关闭信号
        signal(SIGSTOP, SIG_IGN);//忽略停止信号
        
        while(true)
        {
            int client_socket=0;
            std::string client_ip; 
            uint16_t client_port;
            if (!listensocket_.Accept(client_socket, client_ip, client_port)) 
            {
                log(WARNING, "accept error, errno: %d, err string: %s", errno, strerror(errno));
                continue; // 如果接受连接失败，继续等待下一个连接
            }

            if(fork()==0)
            {
                listensocket_.Close(); // 子进程关闭监听套接字
                std::string inbuffer_stream;// 输入流，用于存储从客户端读取的数据
                while(true)
                {
                    char buffer[1024] = {0};
                    int n=read(client_socket, buffer, sizeof(buffer) - 1); // 从客户端读取数据
                    if(n <= 0) 
                    {             
                        break; 
                    } 
                    else 
                    {
                        buffer[n] = '\0'; 
                        inbuffer_stream += std::string (buffer); // 将读取的数据追加到输入流中
                        while(true)
                        {
                            std::string response = callback_(inbuffer_stream); 
                            if(response.empty()) 
                            {
                                break; // 如果处理结果为空，跳出循环
                            }
                            write(client_socket, response.c_str(), response.size()); // 将处理结果发送回客户端
                        }
                    }
                }
                exit(0);
            }
            close(client_socket); 
        }
    }
private:
    uint16_t port_;
    Sockets listensocket_;
    func_t callback_;
};